//package com.jf.otc.chain.service;
//
//import cn.hutool.core.util.StrUtil;
//import cn.hutool.http.HttpResponse;
//import cn.hutool.http.HttpStatus;
//import cn.hutool.http.HttpUtil;
//import com.alibaba.fastjson.JSONArray;
//import com.alibaba.fastjson.JSONObject;
//import lombok.extern.slf4j.Slf4j;
//import org.springframework.stereotype.Component;
//
//import java.math.BigDecimal;
//import java.math.BigInteger;
//import java.math.RoundingMode;
//import java.time.Duration;
//import java.time.LocalDateTime;
//import java.time.ZoneOffset;
//import java.util.Comparator;
//import java.util.List;
//import java.util.stream.Collectors;
//
//@Component
//@Slf4j
//public class EthereumCheckTransaction extends BaseCheckTransaction {
//
//
//    /**
//     * 获取这个转账订单的备注
//     *
//     * @param apiKey apiKey
//     * @param hash   交易hash
//     * @return
//     */
//    @Override
//    public String checkTransactionMemo(String apiKey, String hash) {
//        try {
//            String param = String.format("?module=proxy&action=eth_getTransactionByHash&txhash=%s&apikey=%s",
//                    hash,
//                    apiKey
//            );
//            HttpResponse response = HttpUtil.createGet(url + param).timeout(10000).execute();
//            if (response.getStatus() == HttpStatus.HTTP_OK) {
//                String body = response.body();
//                JSONObject jsonObject = JSONObject.parseObject(body);
//                if (jsonObject != null && jsonObject.containsKey("result")) {
//                    JSONObject result = jsonObject.getJSONObject("result");
//                    if (result != null && result.containsKey("input")) {
//                        String input = result.getString("input");
//                        String memoHex = input.substring(138);
//                        if (memoHex.length() <= 0) {
//                            log.warn("ETH备注数据为空！记录hash:" + hash);
//                            return null;
//                        }
//                        String memoStr = null;
//                        try {
//                            memoStr = HexUtils.hex2String(memoHex);
//                            log.info("ETH订单id:{},hash:{}", memoStr, hash);
//                        } catch (Exception e) {
//                            log.error("16进制转换字符串失败，源数据：" + input + "，截断数据" + memoHex + "错误：" + e.getMessage(), e);
//                        }
//                        return memoStr;
//                    }
//                }
//            }
//        } catch (Exception ex) {
//            if (StrUtil.isNotEmpty(ex.getMessage()) && (ex.getMessage().contains("UnknownHostException") || ex.getMessage().contains("timed out"))) {
//                log.warn("检测以太坊备注失败:" + ex.getMessage(), ex);
//            } else {
//                log.error("检测以太坊备注失败:" + ex.getMessage(), ex);
//            }
//        }
//        return null;
//    }
//
//    public static void main(String[] args) throws Exception {
//        System.out.println(HexUtils.hex2String("0x8e8370C26c01078BF3d213B11f2931B0D205155d"));
//    }
//
//    @Override
//    public void handlePaymentRecords(ChannelConfig channelConfig, List<RechargeRecord> rechargeRecords) {
//        //判断合约地址是否为多个，如果是多个合约地址，就遍历这些合约地址
//        String contractAddress = channelConfig.getContractAddress();
//        String[] split = contractAddress.split(",");
//        for (String address : split) {
//            try {
//                int page = 1;
//                while (true) {
//                    String param = String.format("?module=account" +
//                                    "&action=tokentx" +
//                                    "&contractaddress=%s" +
//                                    "&address=%s" +
//                                    "&apikey=%s" +
//                                    "&page=%d" +
//                                    "&offset=100" +
//                                    "&sort=desc",
//                            address,
//                            channelConfig.getWalletAddress(),
//                            Wallet.decryptChainApiKey(channelConfig.getChainApiKey()),
//                            page);
//                    HttpResponse response = HttpUtil.createGet(url + param).timeout(10000).execute();
//                    if (response.getStatus() == HttpStatus.HTTP_OK) {
//                        String body = response.body();
//                        JSONObject jsonObject = JSONObject.parseObject(body);
//                        if (jsonObject != null && jsonObject.containsKey("status") && jsonObject.getIntValue("status") == 1) {
//                            if (jsonObject.containsKey("result")) {
//                                JSONArray result = jsonObject.getJSONArray("result");
//                                if (result.size() > 0) {
//                                    for (int i = 0; i < result.size(); ++i) {
//                                        JSONObject tran = result.getJSONObject(i);
//                                        if (tran.containsKey("hash") && StrUtil.isNotEmpty(tran.getString("hash"))
//                                                && tran.containsKey("confirmations") && tran.getIntValue("confirmations") > 20) {
//                                            String tranHash = tran.getString("hash");
//                                            //支付的UTC时间戳
//                                            long timestamp = tran.getLongValue("timeStamp");
//                                            LocalDateTime payTime = LocalDateTime.ofEpochSecond(timestamp, 0, ZoneOffset.of("+8"));
//                                            long days = Duration.between(payTime, LocalDateTime.now()).toDays();
//                                            if (days > 2) {
//                                                log.info("ETH当前记录的时间是两天前的数据，不在往下处理！hash:{}", tranHash);
//                                                break;
//                                            }
//
//                                            String from = tran.getString("from");
//                                            //内存排序，让后面的记录先被消耗，尽可能的去弥补订单号被消费出现插值的问题
//                                            List<RechargeRecord> collect = rechargeRecords.stream().sorted(Comparator.comparing(RechargeRecord::getCreateTime).reversed()).collect(Collectors.toList());
////                                        String memo = checkTransactionMemo(channelConfig.getChainApiKey(), tranHash);
//                                            for (RechargeRecord record : collect) {
//                                                if (StrUtil.isEmpty(record.getFromWalletAddress())) {
//                                                    //地址为空查询数据库是否存在他的地址
//                                                    List<UserWallet> userWallets = userWalletService.getUserWalletsByAll(record.getUserId());
//                                                    for (UserWallet userWallet : userWallets) {
//                                                        if (StrUtil.equals(from,userWallet. getWalletAddress().toLowerCase()) && StrUtil.equals(channelConfig.getChainName(),record.getChainName())) {
//                                                            //找到这个用户的钱包地址。给这条充值记录赋值
//                                                            record.setFromWalletAddress(userWallet.getWalletAddress().toLowerCase());
//                                                        }
//                                                    }
//                                                }
//                                                if (StrUtil.equals(from, record.getFromWalletAddress().toLowerCase())) {//充值订单号相同，千万不要去掉这个转小写，大坑
//                                                    if (payTime.isBefore(DayUtil.dateToLocalDateTIme(record.getCreateTime()))) {
//                                                        //支付时间在生成
//                                                        log.info("{}　链，TOKEN:{},用户：{}，支付时间:{},在生成订单时间{} 之前，这条记录不符合条件，不上分！hash：{}",
//                                                                record.getChainName(),record.getToken(),record.getAccount(),payTime,record.getCreateTime()
//                                                                ,tranHash);
//                                                        continue;
//                                                    }
//                                                    //计算实际充值金额
//                                                    String value = tran.getString("value");
//                                                    //支付的UTC时间戳
////                                                long timestamp = tran.getLongValue("timeStamp");
//
//                                                    String decimals = channelConfig.getDecimals();
//                                                    BigInteger bigInteger = new BigInteger(decimals);
//                                                    String tokenSymbol = tran.getString("tokenSymbol");
//                                                    record.setToken(tokenSymbol);
//                                                    BigInteger descmalsVale = new BigInteger(value);
//                                                    BigDecimal rate = BigDecimal.valueOf(record.getExchangeRate()).setScale(2, RoundingMode.HALF_UP).divide(BigDecimal.valueOf(100L));
//                                                    rechargeGameCost(Recharge.ETH, record, tranHash, timestamp, descmalsVale, bigInteger, rate);
//                                                    record.setStatus(RECHARGE_RECORD_STATUS.RECHARGE_SUCCESS);
//                                                    break;
//                                                }
//                                            }
//
//                                        }
//                                    }
//                                    page++;
//                                } else {
//                                    //没有了
//                                    break;
//                                }
//                            } else {
//                                //没有了
//                                break;
//                            }
//                        } else {
//                            //结构不正确，不继续查
//                            log.warn("以太坊查交易解析异常----" + body);
//                            break;
//                        }
//                    } else {
//                        //请求失败，不继续查
//                        break;
//                    }
//                }
//            } catch (Exception ex) {
//                if (StrUtil.isNotEmpty(ex.getMessage()) && (ex.getMessage().contains("UnknownHostException") || ex.getMessage().contains("timed out"))) {
//                    log.warn("检测以太坊交易失败：" + ex.getMessage(), ex);
//                } else {
//                    log.error("检测以太坊交易失败：" + ex.getMessage(), ex);
//                }
//            }
//            log.info("链：{}，钱包：{}，合约：{}，查询完成！",channelConfig.getChainName(),channelConfig.getWalletAddress(),address);
//        }
//
//
//    }
//}
